package gui;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

import javax.swing.*;
import javax.swing.text.StyledDocument;
import domain.*;

/**
 * Klasse Tab
 * Hierin worden de verschillende tabbladen gemaakt (meerdere chatvensters).
 * Alle tabbladen krijgen een chatkader, een kader met overzicht van gebruikers en een vak om te typen.
 * @author Maarten Minnebo, David Covemaeker, Tim Van Thuyne, Toon Kint
 */

public class Tab extends JPanel
{
	private static final long serialVersionUID = -2336185059563212282L;
	
	private IRCController ircController;
	
	private Color bgc;
	private IRCChannel outputIrcChannel;
	private JButton inputEnterButton;
	private JList userList;
	private JScrollPane outputScrollPane;
	private JScrollPane userScrollPane;
	private JTextField inputTextField;
	private JTextPane outputTextPane;
	private ListModel userListModel;
	private StyledDocument outputStyledDocument;
	private String channel;
	
	/**
	 * Constructor een Tab.
	 * Hieronder wordt een nieuwe tab aangemaakt en wordt de initialisatie van deze GUI opgeroepen.
	 * @param ircController IRCController
	 * @param tabName String met de naam van de nieuwe tab.
	 */
	public Tab(IRCController ircController, String tabName) 
	{
		this.ircController = ircController;
		channel = tabName;

		makeInput();
		makeOutput();
		makeUserList();

		initGUI();
	}
	
	/**
	 * Initialisatie van de GUI van het tabblad. 
	 */
	private void initGUI()
	{
		bgc = new Color(239, 228, 176);
		
		add(outputScrollPane);
		
		add(inputTextField);
		add(inputEnterButton);
		
		add(userScrollPane);
		

		this.setSize(760, 455);
		setLayout(new BorderLayout());
		setBackground(bgc);
		
		setVisible(true);
		
		SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
            	inputTextField.requestFocusInWindow();
            }
        });
	}

	/**
	 * Functie die het inputveld aanmaakt en hier de nodige actionListeners voro aanmaakt.
	 */
	private void makeInput()
	{
		inputTextField = new JTextField();
		inputTextField.setBounds(20, 405, 575, 30);
		inputTextField.setSize(575, 30);
		inputTextField.setLocation(20, 405);
		
		inputTextField.addActionListener(new ActionListener() 
		{
			@Override
			public void actionPerformed(ActionEvent arg0) 
			{
				send();
			}
		});
		
		inputEnterButton = new JButton("Verzenden");
		inputEnterButton.setBounds(615, 405, 125, 30);
		inputEnterButton.setSize(125, 30);
		inputEnterButton.setLocation(615, 405);
		
		inputEnterButton.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e) {
				send();
			}
		});
	}
	
	/**
	 * Functie die de tekst van de gebruiker uit het tekstvak zal versturen naar de IRCController.
	 * Het inputvak wordt ook terug leeggemaakt.
	 */
	private void send()
	{
		if (!inputTextField.getText().equals(""))
		{
			try
			{
				ircController.writeToChannel(channel, inputTextField.getText());
			}
			catch (IOException e)
			{
				JOptionPane.showMessageDialog(this.getRootPane().getContentPane(), "De verbinding is gestopt.", "Verbindingsfout", JOptionPane.ERROR_MESSAGE);
				System.exit(1);
			}
		}
		
		inputTextField.setText("");
	}

	/**
	 * Functie die het output veld aanmaakt (chatkader).
	 * Hierin komen alle chatberichten tussen de gebruikers.
	 */
	private void makeOutput()
	{
		outputIrcChannel = ircController.getIRCChannel(channel);
		
		outputStyledDocument = outputIrcChannel.getStyledDocument();
		
		outputTextPane = new JTextPane(outputStyledDocument);
		outputTextPane.setEditable(false);
		
		outputScrollPane = new JScrollPane(outputTextPane);
		outputScrollPane.setBounds(20, 20, 575, 370);
		outputScrollPane.setSize(575, 370);
		outputScrollPane.setLocation(20, 20);
	}
	
	/**
	 * Functie die de userlist aanmaakt (en naar output stuurt).
	 * In deze lijst verschijnen alle gebruikers die in het kanaal aanwezig zijn.
	 */
	private void makeUserList()
	{
		userListModel = ircController.getIRCChannel(channel).getListModel();
		
		userList = new JList(userListModel);
		userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		userScrollPane = new JScrollPane(userList);
		userScrollPane.setBounds(615, 20, 125, 370);
		userScrollPane.setSize(125, 370);
		userScrollPane.setLocation(615, 20);
	}

	/**
	 * Functie die de username van een aangeklikte gebruiker (in de UserList) teruggeeft. 
	 * @return "UserNameAangeklikteGebruiker"
	 * @throws IndexOutOfBoundsException
	 */
	protected String getSelectedUser() throws IndexOutOfBoundsException
	{
		String nick = (String) userListModel.getElementAt(userList.getSelectedIndex());
		
		if ((nick.charAt(0) == '@') || (nick.charAt(0) == '+'))
			return nick.substring(1);
		return nick;
	}
	
	/**
	 * Functie het JTextField 'inputTextField' zal returnen.
	 * Is een 'getter'.
	 * @return inputTextField
	 */
	protected JTextField getInputTextField()
	{
		return inputTextField;
	}
}
